home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 23 / AMIGAplus Sonderheft 23 (2000)(Falke)(DE)[!].iso / PublicDomain / Goldies / PolyEd2 / Macros / blockformat.ped next >
Text File  |  1999-11-08  |  4KB  |  168 lines

  1. /*
  2. ** $VER: blockformat.ped 1.0 (6.5.95) written by Stefan Schulz
  3. ** bases on format.ped by Robert Brandner
  4. **
  5. ** This macro formats the current paragraph as justified block
  6. ** (from the current line to the next line starting with a space).
  7. */
  8.  
  9. OPTIONS RESULTS
  10.  
  11. OPTIONS FAILAT 11                           /* ignore warnings          */
  12. SIGNAL ON SYNTAX                            /* ensure clean exit        */
  13. SIGNAL ON FAILURE
  14. SIGNAL ON BREAK_C                            /* no label->syntax->exit    */
  15.  
  16. if (LEFT(ADDRESS(), 6) ~= "POLYED") then do
  17.     if SHOW("Ports", "POLYED.1") then
  18.         address 'POLYED.1'
  19.     else do
  20.         say "PolyEd is not running!"
  21.         exit
  22.     end
  23. end
  24.  
  25. 'LOCKGUI'
  26.  
  27. /*----- begin of custom code area --------------------------------------*/
  28.  
  29. 'GETATTR' APPLICATION STEM APP.                /* get all infos on app.    */
  30. 'GETATTR' PROJECT APP.CURRENTPROJECT STEM PROJ. /* get infos on project */
  31. 'GETCURSORPOS' STEM CP.                        /* current line                */
  32.  
  33. /* now we get all lines until we reach a line starting with space or
  34. ** the end of the text, and join them in a buffer (with a space in
  35. ** between).
  36. ** While doing that, we mark all the lines we put into the buffer.
  37. */                                                
  38.  
  39. BUFFER = ""
  40. LINECOUNTER = CP.LINE
  41.  
  42. 'POSITION SOL'    /* Keep starting Spaces */
  43. 'POSITION EOW'  /**/
  44. 'POSITION SOW'  /**/
  45.  
  46. 'GETCURSORPOS' STEM STARTPOS.
  47.  
  48. 'BLOCK START'
  49.  
  50. 'GETLINE' VAR 'LINE'
  51. LINE = strip( LINE, B, " " || '09'X )
  52. if    length(LINE) > 0
  53.  then do
  54.         BUFFER = BUFFER || " " || LINE
  55.         'CURSOR DOWN'
  56.         'POSITION SOL'
  57.         do    forever
  58.             'GETLINE' VAR 'LINE'
  59.             if (length(LINE) = 0) | (left(LINE,1) = ' ') then leave
  60.             LINE = strip(LINE, B, " "||'09'X)
  61.             BUFFER = BUFFER || " " || LINE
  62.             'CURSOR DOWN'
  63.             LINECOUNTER = LINECOUNTER+1        /* increment linecounter    */
  64.             if    LINECOUNTER > PROJ.LINES
  65.              then do
  66.                     'POSITION EOL'            /* mark last line too        */
  67.                     leave
  68.                   end
  69.         end
  70.       end
  71.  
  72. 'ERASE'                                        /* erase the marked area    */
  73.  
  74. 'SETATTR APPLICATION FIELD FLAG_AUTOINDENT NEWVALUE 0'
  75.  
  76. /* Now we write out the buffer again.
  77. ** To be faster we create a complete line internally
  78. ** instead of writing each single word.
  79. */
  80.  
  81. len = STARTPOS.COLUMN - 1                    /* add leading spaces        */
  82. numwords = words(BUFFER)                    /* #words in buffer            */
  83. do    i = 1 to numwords
  84.  
  85.     /* collect words until line is full */
  86.     cnt  = 0
  87.     line = ""
  88.     do    j = i to numwords
  89.         w    = word(BUFFER,j)
  90.         wlen = length(w)
  91.         if (len + wlen) >= APP.VAR_RIGHTBORDER then leave j
  92.  
  93.         if length(line) = 0
  94.          then    line = w
  95.          else    line = line || " " || w
  96.  
  97.         len = len + wlen + 1
  98.         cnt = cnt + 1
  99.  
  100.         if j = numwords then leave i
  101.     end
  102.  
  103.     if cnt > 0 then cnt = cnt - 1
  104.  
  105.     /* fill line with spaces. Start with punctuation marks. */
  106.     nPos = length(line)
  107.     cmp = '. '
  108.     do j = 0 while len < APP.VAR_RIGHTBORDER
  109.         nPos = lastpos( cmp, line, nPos - 1 )
  110.         if nPos = 0
  111.          then do
  112.                  select
  113.                      when cmp = '. ' then cmp = '! '
  114.                      when cmp = '! ' then cmp = '? '
  115.                      when cmp = '? ' then cmp = '; '
  116.                      when cmp = '; ' then cmp = ': '
  117.                      when cmp = ': ' then cmp = ', '
  118.                      otherwise leave j
  119.                  end
  120.  
  121.                 nPos = length(line)
  122.  
  123.                end
  124.          else do
  125.                 line = left(line, nPos) || ' ' || right(line, length(line) - nPos)
  126.                 len = len + 1
  127.               end
  128.     end
  129.     
  130.     /* add spaces to line behind each word, if line still to short */
  131.     nPos = 0
  132.     inc  = 3
  133.     do j = 0 while len < APP.VAR_RIGHTBORDER
  134.         nPos = pos( ' ', line, nPos + inc )
  135.         if nPos = 0
  136.          then inc = inc + 1
  137.          else do
  138.                 line = left(line, nPos) || ' ' || right(line, length(line) - nPos)
  139.                 len = len + 1
  140.               end
  141.     end
  142.  
  143.     i   = i + cnt
  144.     len = 0
  145.  
  146.     'TEXT' line
  147.     'TEXT NEWLINE'
  148. end
  149.  
  150. 'TEXT' line
  151. 'TEXT NEWLINE'
  152.  
  153. 'SETATTR APPLICATION FIELD FLAG_AUTOINDENT NEWVALUE' APP.FLAG_AUTOINDENT
  154.  
  155. /*----- end of custom code area ----------------------------------------*/
  156.  
  157. 'UNLOCKGUI'                                    /* Clean exit                */
  158. EXIT
  159.  
  160. SYNTAX:                                     /* ARexx error...           */
  161. say "Error line" SIGL ":" ERRORTEXT(RC)     /* report it...             */
  162. 'UNLOCKGUI'                                 /* Unlock GUI!              */
  163. EXIT                                        /* exit                     */
  164.  
  165. FAILURE:
  166. 'UNLOCKGUI'                                 /* Unlock GUI!              */
  167. EXIT                                        /* exit                     */
  168.